package cn.wolfcode.luowowo.website.controller;

import cn.wolfcode.luowowo.article.query.TravelQuery;
import cn.wolfcode.luowowo.article.service.IStrategyCommendService;
import cn.wolfcode.luowowo.article.service.ITravelCommendService;
import cn.wolfcode.luowowo.article.service.ITravelService;
import cn.wolfcode.luowowo.cache.service.IUserInfoRedisService;
import cn.wolfcode.luowowo.member.domain.UserInfo;
import cn.wolfcode.luowowo.search.query.SearchQueryObject;
import cn.wolfcode.luowowo.search.service.*;
import cn.wolfcode.luowowo.search.template.DestinationTemplate;
import cn.wolfcode.luowowo.search.template.StrategyTemplate;
import cn.wolfcode.luowowo.search.template.TravelTemplate;
import cn.wolfcode.luowowo.search.template.UserInfoTemplate;
import cn.wolfcode.luowowo.search.vo.SearchResultVO;
import cn.wolfcode.luowowo.website.util.CookieUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
public class IndexController {

    @Reference
    private IUserInfoRedisService userInfoRedisService;
    @Reference
    private ITravelCommendService travelCommendService;
    @Reference
    private IStrategyCommendService strategyCommendService;

    @Reference
    private IDestinationTemplateSearchService destinationTemplateSearchService;

    @Reference
    private IStrategyTemplateSearchService strategyTemplateSearchService;

    @Reference
    private ITravelTemplateSearchService travelTemplateSearchService;

    @Reference
    private IUserInfoTemplateSearchService userInfoTemplateSearchService;


    @Reference
    private ITravelService travelService;


    @Reference
    private ISearchService searchService;



    //@RequireLogin //代表该方法必须登录.
    @RequestMapping("")
    public String index(Model model, HttpServletRequest request){
        String  token = CookieUtil.getToken(request);
        if(token != null){
            UserInfo userInfo = userInfoRedisService.getUserByToken(token);
            //共享当前登录用户信息
            request.getSession().setAttribute("userInfo", userInfo);
        }

        //首页游记推荐
        //tcs
        model.addAttribute("tcs", travelCommendService.getTop5());

        //攻略推荐
        //scs
        model.addAttribute("sc", strategyCommendService.getTop5().get(0));


        return "index/index";
    }


    @RequestMapping("/index/travelPage")
    public String travelPage(Model model, @ModelAttribute("qo")TravelQuery qo){

        model.addAttribute("pageInfo", travelService.query(qo));
        return "index/travelPageTpl";
    }

    @RequestMapping("/q")
    public String search(Model model, @ModelAttribute("qo")SearchQueryObject qo){
        switch (qo.getType()){
            case SearchQueryObject.SEARCH_TYPE_DEST:
                 return destSearch(model, qo);
            case SearchQueryObject.SEARCH_TYPE_STRATEGY:
                return strategySearch(model, qo);
            case SearchQueryObject.SEARCH_TYPE_TRAVEL:
                return travelSearch(model, qo);
            case SearchQueryObject.SEARCH_TYPE_USER:
                return userSearch(model, qo);
            default:return allSearch(model, qo); //所有
        }
    }

    //目的地
    private String destSearch(Model model, SearchQueryObject qo) {
        SearchResultVO data = new SearchResultVO();
        //1:查询目的地对象
        DestinationTemplate dest = destinationTemplateSearchService.findByName(qo.getKeyword());
        if(dest != null){
            //2:查该目的地下的所有攻略, 前5个
            long total = 0;
            List<StrategyTemplate> sts = strategyTemplateSearchService.findByDestName(dest.getName());
            total += sts.size();
            if(sts.size() > 5){
                sts = sts.subList(0, 5);
            }
            //3:查该目的地下的所有游记, 前5个
            List<TravelTemplate> ts = travelTemplateSearchService.findByDestName(dest.getName());
            total += ts.size();
            if(ts.size() > 5){
                ts = ts.subList(0, 5);
            }
            //4:查该目的地下的所有用户, 前5个
            List<UserInfoTemplate> us = userInfoTemplateSearchService.findByDestName(dest.getName());
            total += us.size();
            if(us.size() > 5){
                us = us.subList(0, 5);
            }
            data.setStrategys(sts);
            data.setTravels(ts);
            data.setUsers(us);
            data.setTotal(total);

            model.addAttribute("data", data);
        }
        model.addAttribute("dest", dest);

        return "index/searchDest";
    }

    //用户
    private String userSearch(Model model, SearchQueryObject qo) {

        //参数1: 索引 参数2:索引类型  参数3:结果list泛型 参数4:qo  参数5:查询的字段集合

        Page<UserInfoTemplate> page = searchService.searchWithHighlight(UserInfoTemplate.INDEX_NAME, UserInfoTemplate.TYPE_NAME,
                UserInfoTemplate.class, qo, "nickname", "destName");



        model.addAttribute("page", page);

        return "index/searchUser";
    }

    //游记
    private String travelSearch(Model model, SearchQueryObject qo) {
        //参数1: 索引 参数2:索引类型  参数3:结果list泛型 参数4:qo  参数5:查询的字段集合
        Page<TravelTemplate> page = searchService.searchWithHighlight(TravelTemplate.INDEX_NAME, TravelTemplate.TYPE_NAME,
                TravelTemplate.class, qo, "title", "summary");

        model.addAttribute("page", page);
        return "index/searchTravel";
    }

    ///攻略
    private String strategySearch(Model model, SearchQueryObject qo) {
        //参数1: 索引 参数2:索引类型  参数3:结果list泛型 参数4:qo  参数5:查询的字段集合
        Page<StrategyTemplate> page = searchService.searchWithHighlight(StrategyTemplate.INDEX_NAME, StrategyTemplate.TYPE_NAME,
                StrategyTemplate.class, qo, "title", "subTitle","summary");

        model.addAttribute("page", page);
        return "index/searchStrategy";

    }

    //所有
    private String allSearch(Model model, SearchQueryObject qo) {

        Page<DestinationTemplate> dests = searchService.searchWithHighlight(DestinationTemplate.INDEX_NAME, DestinationTemplate.TYPE_NAME,
                DestinationTemplate.class, qo, "name", "info");

        Page<UserInfoTemplate> users = searchService.searchWithHighlight(UserInfoTemplate.INDEX_NAME, UserInfoTemplate.TYPE_NAME,
                UserInfoTemplate.class, qo, "nickname", "destName");

        Page<TravelTemplate> travels = searchService.searchWithHighlight(TravelTemplate.INDEX_NAME, TravelTemplate.TYPE_NAME,
                TravelTemplate.class, qo, "title", "summary");

        Page<StrategyTemplate> strategys = searchService.searchWithHighlight(StrategyTemplate.INDEX_NAME, StrategyTemplate.TYPE_NAME,
                StrategyTemplate.class, qo, "title", "subTitle","summary");


        SearchResultVO data = new SearchResultVO();

        data.setUsers(users.getContent());
        data.setTravels(travels.getContent());
        data.setStrategys(strategys.getContent());
        data.setDests(dests.getContent());

        data.setTotal(dests.getTotalElements() + users.getTotalElements() +travels.getTotalElements() +  strategys.getTotalElements());

        model.addAttribute("data", data);

        return "index/searchAll";
    }











//----------------------------------------------------------------

    //需求: 在请求方法获取当前登录用户对象

    @RequestMapping("/useInfo")
    @ResponseBody
    public Object useInfo(HttpServletRequest request){
        String  token = CookieUtil.getToken(request);
        UserInfo userInfo = userInfoRedisService.getUserByToken(token);

        return userInfo;
    }




    @RequestMapping("/useInfo2")
    @ResponseBody
    public Object useInfo2(HttpServletRequest request,UserInfo userInfo){


        return userInfo;
    }




    //1:springmvc也有参数解析器
    //2:自定义参数解析器

    //如果直接在映射方法中写 UserInfo userInfo 出现2个参数注解解析出现冲突
    // 会以springmvc的为主



    //如果UserInfo 参数前面贴有@UserParam注解标签使用我自己自定义参数解析器
    //没有时, 用springmvc自己的

    @RequestMapping("/useInfo3")
    @ResponseBody
    public Object useInfo3(HttpServletRequest request,  UserInfo userInfo){
        return userInfo;
    }








}
